package main

import (
	"grpc-server/global"
	"grpc-server/initialize"
	"grpc-server/utils"
	"log"
	"net"
	"os"
	"os/signal"
	"syscall"

	"google.golang.org/grpc"
	"google.golang.org/grpc/health"
	"google.golang.org/grpc/health/grpc_health_v1"

	examplePb "grpc-server/grpc-protocol/example"
	"grpc-server/logic/example"
)

// proto 转代码
//go:generate protoc --go_out=. --go_opt=paths=import proto/*.proto
//go:generate protoc --go-grpc_out=. --go-grpc_opt=paths=import proto/*.proto

func main() {

	// 预加载配置文件
	initialize.Preload()

	// 初始化全局变量
	global.Init()

	// 初始化服务
	s := grpc.NewServer()

	// 注册健康检查服务
	grpc_health_v1.RegisterHealthServer(s, health.NewServer())

	// 注册示例服务
	examplePb.RegisterGreeterServer(s, example.NewGreaterServer())

	// 监听 tcp 的 xxx 端口
	lis, err := net.Listen("tcp", utils.GetIpPort())
	if err != nil {
		log.Fatalf("failed to listen: %v", err) // 监听发生错误就打印出来，随后退出
	}

	// 开启服务
	go func() {
		err = s.Serve(lis)
		if err != nil {
			log.Fatalf("failed to serve: %v", err)
		}
	}()

	global.LOG.Infof("server listening at %v", lis.Addr()) // 打印一些启动信息

	// 注册中心注册服务
	go initialize.ConsulRegister()

	// 当收到退出信号，就进行服务注销
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	initialize.ConsulCancelRegister()
}
